#include "gameplay.h"
#include <QKeyEvent>
#include <QMouseEvent>
#include"bullet.h"


GamePlay::GamePlay(QWidget *parent) : QWidget(parent) {
    // 创建场景
    scene = new QGraphicsScene(this);

    // 创建视图并设置场景
    view = new QGraphicsView(scene, this);
    view->setRenderHint(QPainter::Antialiasing);
    view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    // 加载角色图像
    playerPixmap.load("C:\\Users\\25403\\Desktop\\avatar.png");

    // 添加角色到场景
    player = scene->addPixmap(playerPixmap);
    player->setPos(scene->sceneRect().center()); // 设置初始位置为场景中心

    player->setPos(200,400);
    // 设置视图大小和场景边界（这里假设视图和场景大小相同）
    view->setSceneRect(0,0, 600, 600); // 假设场景大小为800x600
    setFixedSize(600,600); // 设置窗口大小为800x600

    // 布局视图
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(view);
    setLayout(layout);

    // 初始化其他游戏逻辑...
    fallTimer = new QTimer(this);
    connect(fallTimer, &QTimer::timeout, this, &GamePlay::FallToGround);
    fallTimer->start(100);

    sizeChangeTimer = new QTimer(this);
    connect(sizeChangeTimer, &QTimer::timeout, this, &GamePlay::adjustWindowSize);
    sizeChangeTimer->start(1000);

}

GamePlay::~GamePlay() {
    // 清理资源
    delete scene;
    delete view;
    delete fallTimer;
    delete sizeChangeTimer;
}

void GamePlay::keyPressEvent(QKeyEvent *event) {
    if (event->key() == Qt::Key_A) {
        // 检查边界并移动角色
        QRectF rect = player->boundingRect(); // 获取玩家的边界矩形
        QPointF currentPos = player->pos(); // 获取玩家的当前位置
        if (currentPos.x() > rect.width() / 2) { // 确保不会移出左边界（这里假设角色中心为其位置）
            player->moveBy(-10, 0); // 向左移动
            qDebug()<<"左";
        }
    } else if (event->key() == Qt::Key_D) {
        // 检查边界并移动角色
        QRectF rect = player->boundingRect(); // 获取玩家的边界矩形
        QPointF currentPos = player->pos(); // 获取玩家的当前位置
        if (currentPos.x() + rect.width()/2  < scene->width()) { // 确保不会移出右边界（这里假设角色中心为其位置）
            player->moveBy(10, 0); // 向右移动
        }
    }

    if (event->key() == Qt::Key_W) {
        // 检查边界并移动角色向上
        QRectF rect = player->boundingRect(); // 获取玩家的边界矩形
        QPointF currentPos = player->pos(); // 获取玩家的当前位置
        if (currentPos.y() - rect.height() / 2 > 0) { // 确保不会移出上边界（这里假设角色中心为其位置）
            player->moveBy(0, -10); // 向上移动
        }
    } else if (event->key() == Qt::Key_S) {
        // 检查边界并移动角色向下
        QRectF rect = player->boundingRect(); // 获取玩家的边界矩形
        QPointF currentPos = player->pos(); // 获取玩家的当前位置
        if (currentPos.y() + rect.height() < view->height()) { // 确保不会移出下边界（这里假设角色中心为其位置）
            player->moveBy(0, 10); // 向下移动
        }
    }
    // 添加对其他按键的处理...

    // 记得调用基类的keyPressEvent，除非你确实要阻止它
    // QWidget::keyPressEvent(event);
}


void GamePlay::FallToGround()
    {
    QRectF rect = player->boundingRect();
    QPointF currentPos = player->pos();
    qDebug()<<currentPos.y();
    qDebug()<<scene->sceneRect().height();
    if(currentPos.y() + rect.height() < scene->sceneRect().height())
    {
        //player->moveBy(0, -10);
        currentPos.setY(currentPos.y() + 1); // 假设每次下落10个像素
        player->setPos(currentPos);

    }
};


void GamePlay::adjustWindowSize() {
    // 逐步减小窗口大小
    if (currentWidth > minWidth) {
        currentWidth -= 10; // 每次减小10个像素，你可以根据需要调整这个值
    }
    if (currentHeight > minHeight) {
        currentHeight -= 10; // 每次减小10个像素
    }

    // 设置新的窗口大小，但不能小于最小限制
    setFixedSize(currentWidth, currentHeight);

    // 如果窗口已经达到最小大小，停止定时器
    if (currentWidth == minWidth && currentHeight == minHeight) {
        sizeChangeTimer->stop();
    }
}
void GamePlay::mousePressEvent(QMouseEvent *event) {
    // 鼠标点击事件处理
    QPointF scenePos = view->mapToScene(event->pos());
    // 检查是否在场景内
    if (/*boundary.contains(scenePos.toPoint())*/1) {
        // 计算子弹发射方向
        QPointF direction = scenePos - player->pos();
        qreal length = std::sqrt(direction.x() * direction.x() + direction.y() * direction.y());
        if (length > 0.0) {
            direction /= length; // 手动归一化
        }

        // 创建并添加子弹
        QPixmap pixmap("C:\\Users\\25403\\Desktop\\fire.png");
        Bullet *bullet = new Bullet(nullptr, pixmap, player->pos(), direction);

       // Bullet *bullet = new Bullet(nullptr, QPixmap("C:\\Users\\25403\\Desktop\\fire.png"), player->pos(), direction);
        scene->addItem(bullet);

        // 如果需要，可以启动子弹移动的定时器
        bullet->startMoving();
    }

}
